package Naves.Tanques;

import java.awt.Point;
import Audio.S_Bomba;
import Audio.Sonidos_Disparos;
import Balas.Bala;
import Balas.Bala_Tanque;
import Control_Teclado.ManejadorDeTeclas;
import Graficas_personajes.grafico_nave;
import Juego.Juego;
import Naves.Nave;

/**
 * Nave que controla el jugador llamadas tanque
 * 
 * @author Javier Graff
 * @author Eric Avondet
 * @author Rodrigo Herrera
 */

@SuppressWarnings("serial")
public abstract class Tanque extends Nave 
{
	
	protected int Bombas;
	protected int Puntaje;
	protected int Nivel_Disparo;
	protected ManejadorDeTeclas m;
	protected Sonidos_Disparos son;
	protected Sonidos_Disparos son_bom;
	protected int disparos_recibidos;	
	protected int ene_max;
	
	
	/**
	 * retorna los graficos del tanque
	 * @return
	 */
	public grafico_nave getIconos()
	{
		return Iconos;
	}
	
	/**
	 * Constructor
	 * @param dificultad dificultad del juego
	 * @param j
	 */
	protected Tanque(Juego j) 
	{
		
			super(j);
			Nivel_Disparo=1;
			Puntaje=0;
			Bombas=2;
			son_bom= new S_Bomba();
			disparos_recibidos=0;
			//crea el objeto que manejara los eventos del teclado
			m = new ManejadorDeTeclas(this);
	}
	
	/**
	 * aumenta la cant de disparos recibidos
	 */
	public void recibio_disparo()
	{
		disparos_recibidos++;
	}
	
	/**
	 * obtiene la cantidad de disparos recibidos
	 * @return cant de disp
	 */
	public int get_disp_rec()
	{
		return disparos_recibidos;
	}
	
	/**
	 * aumenta el nivel del disparo
	 */
	public void aumentar_nivel_disparo()
	{
		if (Nivel_Disparo<3)
		{
			Nivel_Disparo++;
		}
	}
	
	/**
	 * obtiene el manejador de teclas
	 * @return
	 */
	public ManejadorDeTeclas getManejadorTeclas()
	{
		return m;
	}
	
	/**
	 * Dispara una bomba
	 */
	public void TirarBomba()
	{
		if (Bombas>0)
		{
			son_bom.reproducir();
			this.setLocation(this.getX(), this.getY()+15);
			if (this.getY()>juego.getgraficos().getGraficoEntidades().getpanel().getHeight()-this.getHeight())
				this.setLocation(this.getX(),juego.getgraficos().getGraficoEntidades().getpanel().getHeight()-this.getHeight());//tira hacia atras
			juego.getcontrolenemigos().bomba_a_enemigos();
			Bombas--;
			juego.getgraficos().getGraficoInfo().setBombas(Bombas);
		}
	}
	
	/**
	 * Aumenta la energia del tanque
	 * @param e cantidad de energia
	 */
	public void aumentarenergia(int e)
	{
		Energia+=e;
		if (Energia > ene_max) Energia = ene_max;
		juego.getgraficos().getGraficoInfo().setEnergia(Energia);
	}
	
	/**
	 * Aumenta en cant la cantidad de bombas
	 * @param cant cantidad de bombas
	 */
	public void cargarBombas(int cant)
	{
		Bombas+=cant;
		juego.getgraficos().getGraficoInfo().setBombas(Bombas);
		System.out.println("Bombas="+ Bombas);
	}
	
	/**
	 * Retorna el puntaje del jugador
	 * @return
	 */
	public int getPuntaje()
	{
		return Puntaje;
	}
	
	/**
	 * Aumenta el puntaje del jugador
	 * @param pts puntos ganados
	 */
	public void aumentarPuntaje(int pts)
	{
		Puntaje+=pts;
		juego.getgraficos().getGraficoInfo().setPuntaje(Puntaje);
	}
	
	
	/**
	 * Crea balas y las introduce en el juego
	 */
	public void disparar()
	{
		//juego.getAudios().disp_tanque();
		son.reproducir();

		if (Nivel_Disparo == 1)
		{
			Bala b = new Bala_Tanque(this,juego);
			Point postanque = this.getLocation();
			int posx = (int) postanque.getX()+ ( (this.getWidth()/2) - (b.getWidth()/2)); 
			int posy = (int) postanque.getY() - b.getHeight();
			b.setLocation(posx, posy);
			
		}
		else
			if (Nivel_Disparo == 2)
			{
				Point postanque = this.getLocation();
				{
					Bala b1 = new Bala_Tanque(this,juego);
					int posx = (int) postanque.getX()+ ( (this.getWidth()/4)  - (b1.getWidth()/2)); 
					int posy = (int) postanque.getY() - b1.getHeight();
					b1.setLocation(posx, posy);
				
					Bala b2 = new Bala_Tanque(this,juego);
					posx = (int) postanque.getX()+ ( (this.getWidth()/4)*3  - (b2.getWidth()/2)); 
					posy = (int) postanque.getY() - b2.getHeight();
					b2.setLocation(posx, posy);
					
				}
				
				juego.getgraficos().getGraficoEntidades().getpanel().repaint();
				
			}
			else if (Nivel_Disparo == 3)
			{
				Point postanque = this.getLocation();
				{
					Bala b1 = new Bala_Tanque(this,juego);
					int posx = (int) postanque.getX(); 
					int posy = (int) postanque.getY() - b1.getHeight();
					b1.setLocation(posx, posy);
				
					Bala b2 = new Bala_Tanque(this,juego);
					posx = (int) postanque.getX()+ ( this.getWidth()  - (b2.getWidth())); 
					posy = (int) postanque.getY() - b2.getHeight();
					b2.setLocation(posx, posy);
					
					Bala b3 = new Bala_Tanque(this,juego);
					posx = (int) postanque.getX()+ ( (this.getWidth()/2) - (b3.getWidth()/2)); 
					posy = (int) postanque.getY() - b3.getHeight();
					b3.setLocation(posx, posy);
				}
				
				//juego.getgraficos().getGraficoEntidades().getpanel().repaint();
			}
		
	}
	
	/**
	 * dispara con direccion noreste
	 */
	public void disparar_D()
	{
		//juego.getAudios().disp_tanque();
		son.reproducir();

		if (Nivel_Disparo == 1)
		{
			Bala b = new Bala_Tanque(this,juego);
			b.set_mov_ne();
			Point postanque = this.getLocation();
			int posx = (int) postanque.getX()+ ( (this.getWidth()/2) - (b.getWidth()/2)); 
			int posy = (int) postanque.getY() - b.getHeight();
			b.setLocation(posx, posy);
			
		}
		else
			if (Nivel_Disparo == 2)
			{
				Point postanque = this.getLocation();
				{
					Bala b1 = new Bala_Tanque(this,juego);
					b1.set_mov_ne();
					int posx = (int) postanque.getX()+ ( (this.getWidth()/4)  - (b1.getWidth()/2)); 
					int posy = (int) postanque.getY() - b1.getHeight();
					b1.setLocation(posx, posy);
				
					Bala b2 = new Bala_Tanque(this,juego);
					b2.set_mov_ne();
					posx = (int) postanque.getX()+ ( (this.getWidth()/4)*3  - (b2.getWidth()/2)); 
					posy = (int) postanque.getY() - b2.getHeight();
					b2.setLocation(posx, posy);
					
				}
				
				juego.getgraficos().getGraficoEntidades().getpanel().repaint();
				
			}
			else if (Nivel_Disparo == 3)
			{
				Point postanque = this.getLocation();
				{
					Bala b1 = new Bala_Tanque(this,juego);
					b1.set_mov_ne();
					int posx = (int) postanque.getX(); 
					int posy = (int) postanque.getY() - b1.getHeight();
					b1.setLocation(posx, posy);
				
					Bala b2 = new Bala_Tanque(this,juego);
					b2.set_mov_ne();
					posx = (int) postanque.getX()+ ( this.getWidth()  - (b2.getWidth())); 
					posy = (int) postanque.getY() - b2.getHeight();
					b2.setLocation(posx, posy);
					
					Bala b3 = new Bala_Tanque(this,juego);
					b3.set_mov_ne();
					posx = (int) postanque.getX()+ ( (this.getWidth()/2) - (b3.getWidth()/2)); 
					posy = (int) postanque.getY() - b3.getHeight();
					b3.setLocation(posx, posy);
				}
				
				//juego.getgraficos().getGraficoEntidades().getpanel().repaint();
			}
		
	}
	
	/**
	 * dispara con direccion noroeste
	 */
	public void disparar_I()
	{
		//juego.getAudios().disp_tanque();
		son.reproducir();

		if (Nivel_Disparo == 1)
		{
			Bala b = new Bala_Tanque(this,juego);
			b.set_mov_no();
			Point postanque = this.getLocation();
			int posx = (int) postanque.getX()+ ( (this.getWidth()/2) - (b.getWidth()/2)); 
			int posy = (int) postanque.getY() - b.getHeight();
			b.setLocation(posx, posy);
			
		}
		else
			if (Nivel_Disparo == 2)
			{
				Point postanque = this.getLocation();
				{
					Bala b1 = new Bala_Tanque(this,juego);
					b1.set_mov_no();
					int posx = (int) postanque.getX()+ ( (this.getWidth()/4)  - (b1.getWidth()/2)); 
					int posy = (int) postanque.getY() - b1.getHeight();
					b1.setLocation(posx, posy);
				
					Bala b2 = new Bala_Tanque(this,juego);
					b2.set_mov_no();
					posx = (int) postanque.getX()+ ( (this.getWidth()/4)*3  - (b2.getWidth()/2)); 
					posy = (int) postanque.getY() - b2.getHeight();
					b2.setLocation(posx, posy);
					
				}
				
				juego.getgraficos().getGraficoEntidades().getpanel().repaint();
				
			}
			else if (Nivel_Disparo == 3)
			{
				Point postanque = this.getLocation();
				{
					Bala b1 = new Bala_Tanque(this,juego);
					b1.set_mov_no();
					int posx = (int) postanque.getX(); 
					int posy = (int) postanque.getY() - b1.getHeight();
					b1.setLocation(posx, posy);
				
					Bala b2 = new Bala_Tanque(this,juego);
					b2.set_mov_no();
					posx = (int) postanque.getX()+ ( this.getWidth()  - (b2.getWidth())); 
					posy = (int) postanque.getY() - b2.getHeight();
					b2.setLocation(posx, posy);
					
					Bala b3 = new Bala_Tanque(this,juego);
					b3.set_mov_no();
					posx = (int) postanque.getX()+ ( (this.getWidth()/2) - (b3.getWidth()/2)); 
					posy = (int) postanque.getY() - b3.getHeight();
					b3.setLocation(posx, posy);
				}
				
				//juego.getgraficos().getGraficoEntidades().getpanel().repaint();
			}
		
	}


	
	/**
	 * El tanque muere
	 */
	public void morir() 
	{
		juego.derrota();
	}
	
	
	/**
	 * La nave se mueve hacia la parte superior de la pantalla pero no sobrepasa el borde superior del panel
	 */
	
	public void avanzar()
	{
		Point pos = this.getLocation();
		
		if (pos.getY()-Velocidad<0)
		{
			pos.setLocation(pos.getX(), 0);
		}
		else pos.setLocation(pos.getX(), pos.getY()-Velocidad);
		
		this.setLocation(pos);	
	}
	
	/**
	 * La nave se mueve hacia la parte inferior de la pantalla pero no sobrepasa el borde inferior del panel
	 */
	public void retroceder()
	{
		
		Point pos = this.getLocation();
		int largo= this.getHeight();
		int largo_panel=juego.getgraficos().getGraficoTanque().getpanel().getHeight();
		
		if ((pos.getY()+largo)+Velocidad > largo_panel)
		{
			pos.setLocation(pos.getX(), largo_panel-largo);
		}
		else 
			pos.setLocation(pos.getX(), pos.getY()+Velocidad);
		
		this.setLocation(pos);	
	}
	
	/**
	 * La nave se mueve hacia la parte derecha de la pantalla pero no sobrepasa el borde derecho del panel
	 */
	public void derecha()
	{
		Point pos = this.getLocation();
		int ancho = this.getWidth();
		int ancho_panel = juego.getgraficos().getGraficoTanque().getpanel().getWidth();
		
		if (pos.getX()+ancho+Velocidad > ancho_panel)
			pos.setLocation(ancho_panel - ancho, pos.getY());
		else
			pos.setLocation(pos.getX()+Velocidad, pos.getY());
		
		this.setLocation(pos);	
	}
	
	/**
	 * La nave se mueve hacia la parte izquierda de la pantalla pero no sobrepasa el borde izquierdo del panel
	 */
	public void izquierda()
	{
		Point pos = this.getLocation();
		
		if (pos.getX()-Velocidad < 0)
			pos.setLocation(0, pos.getY());
		else
			pos.setLocation(pos.getX()-Velocidad, pos.getY());
		
		this.setLocation(pos);	
	}
	
	
/**
 * redice energia, actualiza energia en grafico y llega a ser menor a cero muere
 */
	public void reducirEnergia(int e)
	{
		Energia-=e;
		juego.getgraficos().getGraficoInfo().setEnergia(Energia);
		if (debemorir()) this.morir();
	}


	/**
	 * retorna cantidad de bombas
	 * @return
	 */
	public int cant_bombas() 
	{
		return Bombas;
	}
	
	/**
	 * detiene el control de las teclas
	 */
	public void fin_mov()
	{
		m.fin();
	}
	
	/**
	 * pausa el control de las teclas
	 */
	public void pausar_mov()
	{
		m.pausa();
	}
	
	/**
	 * deja de estar en pausa el control de las teclas
	 */
	public void continuar_mov()
	{
		m.fin_pausa();
	}
	

}
